import {Object3D} from '../../three.module.js';

import {XRHandPrimitiveModel} from './XRHandPrimitiveModel.js';

import {XRHandMeshModel} from './XRHandMeshModel.js';

class XRHandModel extends Object3D {

  constructor(controller) {

    super();

    this.controller = controller;
    this.motionController = null;
    this.envMap = null;

    this.mesh = null;

  }

  updateMatrixWorld(force) {

    super.updateMatrixWorld(force);

    if (this.motionController) {

      this.motionController.updateMesh();

    }

  }

}

class XRHandModelFactory {

  constructor() {

    this.path = null;

  }

  setPath(path) {

    this.path = path;

    return this;

  }

  createHandModel(controller, profile) {

    const handModel = new XRHandModel(controller);

    controller.addEventListener('connected', (event) => {

      const xrInputSource = event.data;

      if (xrInputSource.hand && !handModel.motionController) {

        handModel.xrInputSource = xrInputSource;

        // @todo Detect profile if not provided
        if (profile === undefined || profile === 'spheres') {

          handModel.motionController = new XRHandPrimitiveModel(handModel, controller, this.path, xrInputSource.handedness, {primitive: 'sphere'});

        } else if (profile === 'boxes') {

          handModel.motionController = new XRHandPrimitiveModel(handModel, controller, this.path, xrInputSource.handedness, {primitive: 'box'});

        } else if (profile === 'mesh') {

          handModel.motionController = new XRHandMeshModel(handModel, controller, this.path, xrInputSource.handedness);

        }

      }

    });

    controller.addEventListener('disconnected', () => {

      // handModel.motionController = null;
      // handModel.remove( scene );
      // scene = null;

    });

    return handModel;

  }

}

export {XRHandModelFactory};
